#include "sqliteDataBase.h"
#include <iostream>
#include <string>


// 构造函数
SqliteDataBase::SqliteDataBase() : m_db(nullptr)
{
    
}

// 析构函数
SqliteDataBase::~SqliteDataBase()
{

}

// 连接数据库
bool SqliteDataBase::connectDB(const std::string &connStr)
{
    // 打开数据库
    int ret = sqlite3_open(connStr.c_str(), &m_db);
    if (ret != SQLITE_OK)
    {
        std::cout << "sqlite3 open" << std::endl;
        exit(-1);
    }
    return true;
}

// 执行Sql执行语句(exec)
bool SqliteDataBase::executeSql(const std::string &sql)
{
    // 执行sql语句
    int ret = sqlite3_exec(m_db, sql.c_str(), NULL, NULL, NULL);
    if (ret != SQLITE_OK)
    {
        std::cout << "sqlite exec error." << std::endl;
        return false;
    }

    return true;
}

// 执行Sql查询语句(select)
QueryResult SqliteDataBase::querySql(const std::string &sql)
{
    char **result = NULL;
    int rows = 0; // 行
    int columns = 0; // 列

    QueryResult res;
    int ret = sqlite3_get_table(m_db, sql.c_str(), &result, &rows, &columns, NULL);
    if (ret != SQLITE_OK)
    {
        std::cout << "sqlite3 get table error." << std::endl;
        return res;
    }

    // 列名
    for (int idx = 0; idx < columns; idx++)
    {
        res.columnName.push_back(result[idx]);
    }
    
    // 数据
    for (int row = 1; row <= rows; row++)
    {
        std::vector<std::string> tmp;
        for (int col = 0; col < columns; col++)
        {
            // std::cout << result[row * columns + col] << "\t"; // 打印地址而非字符
            tmp.push_back(result[row * columns + col]);
        }
        res.rows.push_back(tmp);
    }

    return res;
}

// 关闭数据库连接
void SqliteDataBase::close()
{
    sqlite3_close(m_db);
}
